import { fileURLToPath, URL } from "node:url";
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import dts from 'vite-plugin-dts';
import path from 'path';

export default defineConfig({
  plugins: [
    vue(),
    dts({
      // 简化配置，确保类型声明文件正确生成
      include: ['src/components/**/*'],
      outDir: 'common',
      // 自动清理旧的类型声明文件
      cleanVueFileName: true,
      copyDtsFiles: true,
      // 添加beforeWriteFile钩子函数，为导入路径添加.d.ts后缀
      // beforeWriteFile: (filePath: string, content: string) => {
      //   // 只处理index.d.ts文件
      //   if (filePath.endsWith('index.d.ts')) {
      //     // 为相对导入路径添加.d.ts后缀（排除已经有后缀的路径）
      //     let modifiedContent = content.replace(
      //       /from\s+['"]([^'"]+)['"]/g,
      //       (match, path) => {
      //         // 检查路径是否已经有.d.ts、.js、.ts等后缀
      //         if (!path.match(/\.(d\.ts|ts|js|vue|json)$/) && path.startsWith('./')) {
      //           return `from '${path}.d.ts'`;
      //         }
      //         return match;
      //       }
      //     );
      //     return {
      //       filePath,
      //       content: modifiedContent
      //     };
      //   }
      //   return {
      //     filePath,
      //     content
      //   };
      // }
      /* 这段代码的作用解释：
         1. 这是vite-plugin-dts插件的beforeWriteFile钩子函数，用于在生成类型声明文件前修改其内容
         2. 它只处理index.d.ts文件，避免不必要的修改
         3. 核心功能是自动为相对导入路径（以./开头）添加.d.ts后缀
         4. 但会智能地排除已经包含.d.ts、.ts、.js、.vue、.json等后缀的路径
         5. 这样处理后，生成的类型声明文件中的导入路径都能被正确解析
      */
    }),
  ],
  resolve: {
    alias: {
      "@": fileURLToPath(new URL("./src", import.meta.url)),
    },
  },
  build: {
    outDir: 'common',
    emptyOutDir: true,
    lib: {
      // 入口文件 - 只暴露导出的4个组件
      entry: path.resolve(__dirname, 'src/components/index.ts'),
      name: 'MCTPShared',
      // 确保生成的文件名与package.json中的配置匹配
      fileName: () => 'index.js',
      formats: ['es']
    },
    rollupOptions: {
      // 排除外部依赖（使用方需要安装这些）
      external: [
        'vue',
        'vue-router',
        'pinia',
        'element-plus',
        '@element-plus/icons-vue',
        'moment',
        'axios',
        'lodash',
        'uuid',
        'js-cookie'
      ],
      output: {
        globals: {
          vue: 'Vue',
          'vue-router': 'VueRouter',
          pinia: 'Pinia',
          'element-plus': 'ElementPlus',
          'moment': 'moment',
          'axios': 'axios',
          'lodash': '_',
          'uuid': 'uuid',
          'js-cookie': 'Cookies'
        }
      }
    },
    sourcemap: true,
    minify: false,
  },
});